import epsilon from "./epsilon.js";

/**
 * [泊松分布](http://en.wikipedia.org/wiki/Poisson_distribution)是离散概率分布，
 * 表示在固定时间/空间间隔内事件发生次数的概率，当事件以已知平均速率独立发生时适用。
 * 其特征由严格正数的平均到达率（发生率）`λ`决定。
 *
 * @param {number} lambda 泊松分布参数（事件平均发生率）
 * @returns {number[]} 泊松分布概率值数组
 */
function poissonDistribution(lambda) /*: ?number[] */ {
    // 参数有效性验证：λ必须为严格正数
    if (lambda <= 0) {
        return undefined;
    }

    // 当前计算的位置（事件发生次数）
    let x = 0;
    // 累积概率跟踪（用于确定计算停止条件）
    let cumulativeProbability = 0;
    // 存储概率值的数组
    const cells = [];
    // 当前x值的阶乘缓存
    let factorialX = 1;

    // 迭代计算每个可能结果，直到累积概率接近1时停止
    do {
        // 计算当前x值的[概率质量函数](https://en.wikipedia.org/wiki/Probability_mass_function)
        cells[x] = (Math.exp(-lambda) * Math.pow(lambda, x)) / factorialX;
        cumulativeProbability += cells[x];
        x++;
        factorialX *= x; // 更新阶乘值：x! = (x-1)! * x
        // 当累积概率接近1-ε时停止计算（ε为极小值）
    } while (cumulativeProbability < 1 - epsilon);

    return cells;
}

export default poissonDistribution;
